package br.ufrn.cerescaico.sepe.actions;

import br.ufrn.cerescaico.sepe.beans.Participante;
import br.ufrn.cerescaico.sepe.beans.Perfil;
import br.ufrn.cerescaico.sepe.beans.Usuario;
import br.ufrn.cerescaico.sepe.bo.SepeException;
import org.apache.log4j.Logger;

/**
 * Classe Action responsável pelo login no sistema.
 * @author Taciano de Morais Silva - tacianosilva@gmail.com
 * @version 21/07/2009
 * @since 19/09/2008
 */
public class LogonAction extends SepeAction {

    /**
     * Número para serialização.
     */
    private static final long serialVersionUID = 832724798067305294L;

    /**
     * Logger da Classe.
     */
    private Logger logger = Logger.getLogger(LogonAction.class);

    /**
     * Login do usuário.
     */
    private String username;

    /**
     * Senha do usuário.
     */
    private String password;

    private Participante participante;

    /**
     * Período ativo (Período atual).
     */
    //private Periodo periodo;

    /**
     * Verifica a entrada do formulário de login e encaminha para a página
     * principal se não houver erro.
     * @see com.opensymphony.xwork2.ActionSupport#execute()
     */
    @Override
    public String execute() {

        Usuario usuario = null;


        if (!isInvalid(getUsername()) && !isInvalid(getPassword())) {
            try {
                usuario = getSepe().autenticarUsuario(getUsername(), getPassword());
            } catch (SepeException e) {
                logger.error(e.getMessage(), e);
                addActionError(getText(e.getMessage()));
                return INPUT;
            }
        } else {
            addFieldError("username", getText("view.usuario.invalidos"));
            return INPUT;
        }

        
        try {
            participante = getSepe().autenticarParticipante(getUsername(), getPassword());
        } catch (SepeException e) {
            logger.error(e.getMessage(), e);
            addActionError(getText(e.getMessage()));
            return INPUT;
        }
        if (usuario == null) {
            if (participante != null) {
                //Criar usuário
                Usuario newuser = new Usuario();

                newuser.setLogin(participante.getEmail());
                newuser.setSenha(participante.getSenha());
                newuser.setNome(participante.getNome());
                newuser.setEmail(participante.getEmail());
                try {
                    newuser.setPerfil(getSepe().buscarPerfil(Perfil.PARTICIPANTE).getNome());
                    getSepe().incluirUsuario(newuser);
                    usuario = newuser;
                } catch (SepeException e) {
                    logger.error(e.getMessage(), e);
                    addActionError(getText(e.getMessage()));
                    return INPUT;
                }
            }
        }

        getSepe().setUsuarioSessao(usuario);

        if (usuario == null && participante == null) {
            addFieldError("username", getText("view.usuario.invalidos"));
            return INPUT;
        }

        //getCesuWeb().setMenu(createMenu(usuario));
        /*
        try {
            logger.info("execute()");
            //setPeriodo(getCesuWeb().getPeriodoAtivo());
        } catch (SepeException ex) {
            logger.error(ex.getMessage(), ex);
            addActionError(getText(ex.getMessage()));
        }*/
        return SUCCESS;
    }

    public String sair() {
        logger.info("sair()");
        getSepe().setUsuarioSessao(null);
        //getSepe().setMenu(null);
        return INPUT;
    }

    /**
     * @return
     */
    public String getUsername() {
        return username;
    }

    /**
     * @param username
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    public Participante getParticipante() {
        return participante;
    }

    public void setParticipante(Participante participante) {
        this.participante = participante;
    }

    /**
     * @return
     */
    public Integer getIdParticipante() {
        if (participante != null) {
            return participante.getId();
        }
        return null;
    }

    /**
     * @param id
     */
    public void setIdParticipante(Integer id) {
        if (participante == null) {
            participante = new Participante();
        }
        participante.setId(id);
    }
}
